/**************************************************************************
Title: QTableView 与 QTableWidget （表格结构）
Author:ybLin
Describe:

1.QTableView
    在通常情况下，一个应用需要和一批数据（比如数组、列表）进行交互，然后以表格的形式输出这些信息，
    这时就要用到QTableView类了。在QtableView中可以使用自定义的数据模型来进行数据单元添加、单元格删除和设置表格标题等操作，
    一般常见的就是QStandardItemModel模型，通过setModel来绑定数据源。
    使用时需要包含#include <QTableView>和#include <QStandardItemModel>。

  常用方法：
    标题操作：
    setHorizontalHeaderLabels（...）//水平标题设置
    setVerticalHeaderLabels(...)//竖直标题设置
    headerData()//获取当前列的文字内容
    插入数据：
    setItem()//指定设置的行和列，设置QStandardItem
    setData //insertRow创建modeIndex，指定QModelIndex，设置数据
    appendRow()//可以先将一行item的对象添加一个list中然后一次性插入
    删除数据：
    clear() //可以一次将表格内容和表格标题都删掉
    removeRows() //参数1：起始行 参数2：行数 只是想将表格内容清空
    removeColumn() //删除某一列数据
    属性设置：
    horizontalHeader()->setSectionResizeMode(...);//QHeaderView::Fixed:不可手动调整宽度; QHeaderView::ResizeToContents:表格宽度随内容自动扩展;QHeaderView::Stretch:表格宽度自动根据UI进行计算，不可手动调整宽度
    setShowGrid(false);//隐藏网格线
    setGridStyle(Qt::DotLine);//线的样式
 可以自定义数据模型来显示数据：
    qtableview和自定义model对比QTableWidget，可以优化很多内存，特别是在数据量庞大的时候。
    QStandardItemModel可以满足一般的Table的结构，也可以满足树状的结构，
    但是自带缺点是使用起来不够灵活，对数据的操作受限于自带的接口，所以需要自定义model。

    QStringListModel：存储简单的字符串列表
    QStandardItemModel：可以用于树结构的存储，提供了层次数据
    QFileSystemModel：本地系统的文件和目录信息
    QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel：存取数据库数据

    一般情况下满足需求了，不过有时候需要一些定制功能，或者是大量数据下对性能和开销比较注重，
    觉得自带的model无用功能太多效率比较低，这时候自定义model就比较适合了。
    使用自定义model 同时出于这两方面需要，既为了性能也为了特殊功能。 （***）

    展示大量级数据：1）多线程处理 2）动态局部加载
    自行写一个model继承QAbstractTableModel，QAbstractTableModel继承自 QAbstractItemModel，
    用于为 QTableView 提供数据接口，必须实现以下五个接口：
        int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
        int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
        QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
        bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) Q_DECL_OVERRIDE;
        Qt::ItemFlags flags(const QModelIndex& index) const Q_DECL_OVERRIDE;

2.QTableWidget
  是QTableView的子类，使用的是标准的数据模型，其单元格数据是通过QTableWidgetItem对象来实现。

  常用方法：
    标题操作：
    setHorizontalHeaderLabels（...）//水平标题设置
    setVerticalHeaderLabels(...)//竖直标题设置
    插入数据：
    setItem //通过insertRow插入行 setItem指定行列设置QTableWidgetItem
    删除数据：
    clear() //可以一次将表格内容和表格标题都删掉
    removeRow //遍历所有行，进行删除
    属性设置：
    setEditTriggers //设置编辑状态
    setColumnWidth //设置列宽
    setSectionResizeMode //设置伸缩状态
    setSelectionMode //设置连续选择状态
**************************************************************************/
#ifndef WIDGETTABLE_H
#define WIDGETTABLE_H

#include <QWidget>
#include "tableviewheader.h"
#include <QStandardItemModel>
#include <QMutex>
#include "tablemodel.h"

namespace Ui {
class WidgetTable;
}

typedef  struct TEST_TABLE_DATA_T
{
    int nNo;//用户名
    QString sName;//用户姓名
    int nSex;//用户性别
    int nAge;//用户年龄
    QString IP;//IP地址
}TEST_TABLE_DATA;

typedef QHash<QString, TEST_TABLE_DATA> QHashTestTable;
typedef QHash<QString, TEST_TABLE_DATA>::iterator QHashTestTableIterator;



class WidgetTable : public QWidget
{
    Q_OBJECT

    enum COLUMN_NUM_E
    {
        COLUMN_CHECKBOX = 0,
        COLUMN_NO,
        COLUMN_IP,
        COLUMN_ID,
        COLUMN_NAME,
        COLUMN_SEX,
        COLUMN_AGE

    };

public:
    explicit WidgetTable(QWidget *parent = nullptr);
    ~WidgetTable();

    void initTableView();

    void initTableWidget();

    void initCusModelTableView();

    //测试用
    void initTestHash();

    void setColumnWidth(); // 更新列宽
    void resizeEvent(QResizeEvent *); //拉伸

public slots:
    void on_tableViewClick(QModelIndex nIndex);
    void on_tableViewDbClick(QModelIndex nIndex);
    void on_tableViewMenu(const QPoint &pos);
    void on_tableViewSort(int nColumn);
    void on_tableViewSelectAllCheckBoxClick(Qt::CheckState state);


protected:
    void changeEvent(QEvent* event);

private slots:
    void on_Btn_Update_clicked();

    void on_Btn_Get_clicked();
    void on_Btn_Clear_clicked();

    void on_Btn_Update2_clicked();


    void on_Btn_SetCurrentIndex_clicked();

    void on_Btn_SetColor_clicked();

private:
    void retranslateUi();

private:
    Ui::WidgetTable *ui;

private:
    //tableview
    QStandardItemModel *m_pTableModel;
    TableViewHeader *m_pTableHeader;
    QMutex m_lock;
    int m_nCheckedCount;//选中个数
    QMenu *m_actMenu;
    QAction *m_actDevRefresh;

    QHashTestTable m_testTableHash;
    TableModel *m_pModelEx;
};

#endif // WIDGETTABLE_H
